/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Rutas;

import java.util.*;
import java.io.*;
import Rutas.*;
import SimuladorGPS.SimBus;
/**
 *
 * @author Zoila
 */

public class BLAST {

    private final int w=4;
    private List<String> semillasBus= new ArrayList<String>();
    private List<String> semillasIn= new ArrayList<String>();
    
    private List<String> semillasComp;
    
    private final int puntParaderos =5;
    private final int puntOtros=1;
    private int puntTotal=0;
    
    private int incidenciaVel=0;
    private int incidenciaPasoParadero=0;
    private int incidenciaParaderoExtra=0;
    private int incidenciaTotal=0;
    
    private List<Paradero> original = new ArrayList<Paradero>();
    private List<Paradero> recorrido = new ArrayList<Paradero>();
    
    /*
    public void algoritmoObjetos (int ruta, int recorrido){
       //algoritmoObjetos(SimBus.leerRutaOriginal(ruta),SimBus.leerRecorrido(ruta, recorrido));
    }*/
    public void algoritmoObjetos (Ruta original, Ruta recorrido){
        this.original=original.getListaParaderos();
        this.recorrido=recorrido.getListaParaderos();
        alinearObjetos ();
    }
    public int algoritmoObjetos (List<Paradero> original,List<Paradero> obtenida){
        this.original=original;
        this.recorrido=obtenida;
        return alinearObjetos ();
    }
    public int alinearObjetos (){
        int b=0;int i=0;
       /* 
        for (Paradero p:original){
            System.out.print(p.getIdParadero());
        }
        System.out.println();
        for (Paradero p:original){
            System.out.print(p.getIdParadero());
        }
        System.out.println();
        */
        
        for (i =0; i<original.size()&&b<recorrido.size();i++){
           /* System.out.println(i);
            */
            if (original.get(i).getIdParadero()==recorrido.get(b).getIdParadero()){
                
                puntTotal+=puntParaderos;
                if (Utils.valVelocidad(original.get(i).getVelPromedio())==Utils.valVelocidad(recorrido.get(b).getVelPromedio())){
                    puntTotal+=puntOtros;
                }
                else {
                    puntTotal-=Math.abs((int)(Utils.valVelocidad(original.get(i).getVelPromedio())-Utils.valVelocidad(recorrido.get(b).getVelPromedio())));
                    incidenciaVel++;
                }
                b++;
            }
            else {
                //System.out.println(original.get(i).getIdParadero());
                int j=buscarCoincidenciaObj(i,b);
               
                if (j<0){
                    puntTotal-=puntParaderos;
                    incidenciaParaderoExtra++;
                    b++;
                }
                else{
                    puntTotal-=puntParaderos*(j-i);
                     incidenciaPasoParadero+=(j-i);
                    if (i<original.size()){
                        i=j-1;
                    }
                    //semillasIn.remove(i--);
                  //  i=j;
                }
                //semillasComp.add(semNueva);
            }
            
            //(i, semNueva);
            
           // System.out.println(semillasComp.get(i));
        }
        
        if (b!=i){
            if (i<original.size()) 
            {
                incidenciaPasoParadero+=(original.size()-i);
                
            }
            
            if (b<recorrido.size()) {
                
                puntTotal-=puntParaderos*(recorrido.size()-b);
                incidenciaParaderoExtra+=(recorrido.size()-b);
            }//System.out.println("sobran"+b);
            //System.out.println("hola");
            
        }
        incidenciaTotal= incidenciaVel+incidenciaPasoParadero+incidenciaParaderoExtra;    
       /* System.out.println("Total de incidencia: "+incidenciaTotal);
        System.out.println("Total de incidencia vel: "+incidenciaVel);
        System.out.println("Total de incidencia paso Paradero: "+incidenciaPasoParadero);

        System.out.println("Total de incidencia paradero Extra: "+incidenciaParaderoExtra);*/
        return incidenciaTotal;    
    }
    
    public void algoritmo(){
        //cargar datos de ruta Inicial
        leerArch("rutaIn.txt",0);// 0 es cuando es ruta original
        //cargar datos de bus
        leerArch("rutaBus.txt",1);// 1 es cuando es ruta bus
        //comparaSemillas;
        System.out.println(semillasIn.size());
        
        System.out.println(semillasBus.size());
        
        alinear();
        
        System.out.println(semillasComp.size());
        
        for (int i =0; i<semillasIn.size();i++){
            System.out.print(semillasIn.get(i));
        }
        System.out.println();
        for (int i =0; i<semillasComp.size();i++){
            System.out.print(semillasComp.get(i));
        }
        System.out.println();
        for (int i =0; i<semillasBus.size();i++){
            System.out.print(semillasBus.get(i));
        }
        puntTotal-=puntParaderos;
        System.out.println("TOTAL "+ puntTotal);
    }
    
    public void alinear(){
        String semNueva="";
        semillasComp = new ArrayList<String>(semillasIn.size());
        int b=0;int i=0;
        for (i =0; i<semillasIn.size()&&b<semillasBus.size();i++){
            System.out.println(i);
            
            System.out.println(semillasIn.get(i));
            System.out.println(semillasBus.get(b));
            if (semillasIn.get(i).charAt(0) == semillasBus.get(b).charAt(0)){
                puntTotal+=puntParaderos;
                semNueva="+";
                for (int j=1; j< w; j++){
                    if (semillasIn.get(i).charAt(j) == semillasBus.get(b).charAt(j)){
                        semNueva+="+";
                        puntTotal+=puntOtros;
                    }
                    else{
                        semNueva+="-";
                        puntTotal-=puntOtros;
                    }        
                }
                b++;
                semillasComp.add(semNueva);
            }
            else {
              //  semNueva="--";//buscarCoincidencia;
                int j=buscarCoincidencia(i,b);
               // semNueva+=j;
                System.out.println(semNueva);
                if (j<0){
                   // semillasBus.remove(i--);
                    semNueva="----";
                    puntTotal-=puntParaderos;
                    b++;
                }
                else{
                    for (int w=0;w<(j-i);w++){
                        semNueva="----";
                        puntTotal-=puntParaderos;
                    }
                    if (i<semillasIn.size()){
                        i=j-1;
                    }
                    //semillasIn.remove(i--);
                  //  i=j;
                }
                semillasComp.add(semNueva);
            }
            
            //(i, semNueva);
            
           // System.out.println(semillasComp.get(i));
        }
        
        if (b!=i){
            if (i<semillasIn.size()) 
            {
                System.out.println("faltan"+ (semillasIn.size()-i));
                for (int w=0;w<(semillasIn.size()-i);w++){
                        semillasComp.add("----");  
                        puntTotal-=puntParaderos;
                }
            }
            
            if (b<semillasBus.size()) System.out.println("sobran"+b);
            //System.out.println("hola");
                
        }
    } 
    public int buscarCoincidenciaObj(int ind, int b){
        //ind++;
        for (int i =ind; i<original.size()&&b<recorrido.size();i++) {
             if (original.get(i).getIdParadero() == recorrido.get(b).getIdParadero()){
                 return i;
             }
        }
        return -1;
    }
    public int buscarCoincidencia(int ind, int b){
        //ind++;
        for (int i =ind; i<semillasIn.size()&&b<semillasBus.size();i++) {
             if (semillasIn.get(i).charAt(0) == semillasBus.get(b).charAt(0)){
                 return i;
             }
        }
        return -1;
    }
    
       
    public void leerArch(String path, int indicador){
        try {
            Scanner scanner = new Scanner (new FileReader(path));
            while (scanner.hasNextLine()){
                procesar(scanner.nextLine(),indicador);
            }
            scanner.close();
        }catch  (Exception ie){
            System.out.println(ie.toString());
        }
    
    }
    
    public void procesar(String aLine,int ind){
        System.out.println(aLine);
        String sem;
        for (int i=w;i<aLine.length();i+=w){
            sem=aLine.substring(i-w,i);
           // System.out.println(sem); 
            // se agregan las semillas a comparar
            if (ind==0){
                semillasIn.add(sem);// se agregan las semillas a comparar
            }
            else {
                semillasBus.add(sem);
            }
        }
    }
    
    
}

